package com.class5.springboot.frame.repo;

import com.class5.springboot.frame.repo.dto.PageData;

import java.io.InputStream;

import java.util.List;

public interface INormalRepository {

    /**
     * 保存一个实体对象
     *
     * @param entity
     * @return
     */
    <T> T insert(T entity);

    /**
     * 根据id属性是否为空决定调用inser或update方法
     * 如果ID为空调用insert
     * @param entity
     * @return
     */
    <T> T insertOrUpdate(T entity);

    /**
     * 执行批量新加操作
     * @param entities
     * @return
     */
    <T> List<T> batchInsert(List<T> entities);

    /**
     * 更新单个对象，当属性值为空时将不更新，如果需要设置为空，请使用batchUpdate操作
     * @param entity
     */
    <T> T update(T entity);

    /**
     * 执行批量更新操作，不支持乐观锁
     * @param entities
     * @return
     */
    <T> List<T> batchUpdate(List<T> entities);

    /**
     * 删除一个实体对象
     *
     * @param entity
     */
    int remove(Object entity);

    /**
     * 批量删除
     *
     * @param entities
     */
    int batchRemove(List<?> entities);

    /**
     * 根据Id删除一个对象
     *
     * @param id
     */
    int removeById(Class<?> entityClass, Long id);

    /**
     * 根据ID批量删除
     *
     * @param ids
     */
    int batchRemoveByIds(Class<?> entityClass, List<Long> ids);

    /**
     * 根据唯一值加载一个对象
     * @param colName
     * @param value
     * @param entityClass
     * @return
     */
    <T> T getUnique(String colName, Object value, Class<T> entityClass);

    /**
     * 根据ID加载一个对象
     *
     * @param id
     * @param
     * @return
     */
    <T> T get(Long id, Class<T> entityClass);

	/*private Class<?> getClass(String name){
		try {
			return Class.forName(name);
		} catch (Exception e) {
			throw new RepositoryException(e);
		}
	}*/
    /**
     * 返回一个对象
     * @param sql
     * @return
     */
    Object queryForObject(Sql sql);

    /**
     * 返回一个实体对象
     * @param sql
     * @param entityClass 将查询结果转成特定的对象，可以是：Integer.class, Map.class, 实体类, Long.class, String.class等
     * @return
     */
    <T> T queryForObject(Sql sql, Class<T> entityClass);

    /**
     * 返回一个长整数
     * @param sql
     * @return
     */
    Long queryForLong(Sql sql);
    /**
     * 使用自定义行转换器对数据进行转换
     * @param sql
     * @param extract
     * @return
     */
    <T> List<T> query(Sql sql, ExtractRowCallback<T> extract);
    /**
     * 使用自定义转换器查询返回一个对象
     * @param sql
     * @param callback
     * @return
     */
    <T> T queryForObject(Sql sql, ExtractDataCallback<T> callback);

    /**
     * 返回一个Double
     * @param sql
     * @return
     */
    double queryForDouble(Sql sql);

    /**
     * 返回一个Integer
     * @param sql
     * @return
     */
    int queryForInt(Sql sql);

    /**
     * 查询
     * @param sql
     * @param dataClass
     * @return
     */
    @SuppressWarnings("rawtypes")
    List query(Sql sql, Class<?> dataClass);

    /**
     * 执行分页查询，如果有distinct子句将会导致结果total不正确
     * @param sql
     * @param dataClass
     * @return
     */
    PageData queryForPage(Sql sql, Class<?> dataClass, int pageNum, int pageSize);

    /**
     * 执行批量语句
     * @param sql
     */
    int execute(Sql sql);
    /**
     * 根据XML定义执行数据模型的更新
     * 只有当myconfig.dbconfig.needUpdateScheme=true时才执行更新
     * 数据初始化类型由myconfig.dbconfig.dataUpdateType来设置
     * @param stream
     */
    void initSchema(InputStream stream);
    /**
     * 获取指定数据库配置的删除ddl语句
     * @param project
     * @return
     */
    public List<String> getDropDdl(String project);
    /**
     * 获取数据库更新的语句
     * @param project
     * @return
     */
    public List<String> getModifyDdl(String project);
    /**
     * 在事务中执行
     * @param callback
     * @return
     */
    <T> T executeInTransaction(ExecuteInTransactionCallback<T> callback);
}